package com.kamistoat.meimeimall.common.sharding.strategy;

import com.kamistoat.meimeimall.common.sharding.Sharding;
import com.kamistoat.meimeimall.common.sharding.properties.DatabaseProperties;

/**
 * 分库分表策略。不同的策略可以通过构造该接口的不同实现类。
 */
public interface ShardingStrategy {

    /**
     * 分库分表有两件事： 确认分库名，确认分表名，建立和分库的链接，发送请求。
     * 此方法用于确认分库名后建立链接，并返回确认的分表名。
     *
     * @param shardingKeyValue 分库分表key在实际方法中的值
     * @param sharding         @Sharding注解
     * @return 带分表位的实际表名
     */
    String constructConnectAndReturnTableName(String shardingKeyValue, Sharding sharding);

    /**
     * 计算分表名的序号。和基础表名拼接称为最终的分表名
     *
     * @param shardingKeyValue   分库分表key在实际方法中的值
     * @param sharding           Sharding信息
     * @param databaseProperties 数据源属性
     * @return 计算分表
     */
    Integer calculateTableSuffix(String shardingKeyValue, Sharding sharding, DatabaseProperties databaseProperties);


    /**
     * 计算分库名的序号。和基础库名拼接后，与目标分库建立链接
     *
     * @param shardingKeyValue   分库分表key在实际方法中的值
     * @param sharding           Sharding信息
     * @param databaseProperties 数据源属性
     * @return 计算分表
     */
    Integer calculateDatabaseSuffix(String shardingKeyValue, Sharding sharding, DatabaseProperties databaseProperties);
}
